#!/usr/bin/env perl

use warnings;

my $db = grep /^-d$/, @ARGV;
my %jewellery_prefixes;

sub jewellery_name($$)
{
    my ($enum, $name) = @_;
    my $prefix = $jewellery_prefixes{$enum} || "";
    my $type = $enum =~ /^AMU_/ ? "amulet" : "ring";
    return "$type of $prefix$name";
}

open IN, "util/cpp_version item-name.cc|" or die "Can't read item-name.cc\n";
{ undef local $/; $_ = <IN>; }
close IN;

# Remove this from the input so the main jewellery pattern doesn't match.
s/^static [^\n]*_jewellery_effect_prefix\([^\n]*\).(.*?)^}//ms;
my $prefixes = $1;
$jewellery_prefixes{$1} = $2
    while $prefixes =~ /((?:RING|AMU)_[A-Z_]+): *return "([^"]+)";/g;

$items{"wand of $_"} = 1 for /WAND_[A-Z_]+: *return "([^"]+)";/g;
$items{"potion of $_"} = 1 for /POT_[A-Z_]+: *return "([^"]+)";/g;
$items{"scroll of $_"} = 1 for /SCR_[A-Z_]+: *return "([^"]+)";/g;
my %seen_enums;
while (/((?:RING|AMU)_[A-Z_]+): *return "([^"]+)";/g)
{
    next if $seen_enums{$1}++;
    $items{jewellery_name($1, $2)} = 1
}

unless ($db)
{
    $items{"$_ rune of Zot"} = 1 for /RUNE_[A-Z_]+: *return "([^"]+)";/g;
    $items{"$_ deck of cards"} = 1 for /DECK_RARITY_[A-Z_]+: *return "([^"]+)";/g;
}
$items{$_} = 1 for /MISC_[A-Z_]+: *return "([^"]+)";/g;
$items{"book of $_"} = 1 for /BOOK_[A-Z_]+: *return "([^"]+)";/g;
$items{"staff of $_"} = 1 for /STAFF_[A-Z_]+: *return "([^"]+)";/g;

open IN, "util/cpp_version item-prop.cc|" or die "Can't read item-prop.cc\n";
{ undef local $/; $_ = <IN>; }
close IN;

s/" "//g;
$items{$_} = 1 for /\{ *ARM_[A-Z_]+, *"([^"]+)"/mg;
$items{"$_ dragon scales"} = 1 for /^ *DRAGON_ARMOUR\([A-Z_]+, *"([^"]+)"/mg;
$items{$_} = 1 for /^ *\{ *WPN_[A-Z_]+, *"([^"]+)"/mg;
$items{$_} = 1 for /^ *\{ *MI_[A-Z_]+, *"([^"]+)"/mg;

open IN, "util/cpp_version decks.cc|" or die "Can't read decks.cc\n";
{ undef local $/; $_ = <IN>; }
close IN;
my $data = $_;
$data =~ s/.*all_decks =(.*?)};.*/$1/s or die "can't find all_decks\n";
$items{"deck of $_"} = 1 for $data =~ /^\s+"([^"]+)"/mg;

$items{$_} = 1 for (split /\n/, <<END);
corpse
eggplant
gold piece
manual
orb of Zot
pair of boots
pair of gloves
rune of Zot
Young Poisoner's Handbook
Grand Grimoire
Necronomicon
Fen Folio
END

$items{"decaying skeleton"} = 1 if $db;

delete $items{$_} for (split /\n/, <<END);
boots
gloves
END

for (sort keys %items)
{
    next if /bugginess/i;
    # yay consistency, all other descs use proper capitalization
    tr/A-Z/a-z/ if $db && !/Geryon/;
    print "$_\n";
}
